package manager.modulo.clientefornecedor.dao;

import java.sql.SQLException;
import manager.auxiliares.MensagemExcessao;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Timestamp;
import java.util.LinkedList;
import manager.auxiliares.Configurations;
import manager.auxiliares.Format;
import manager.principal.fonte.JanelaLogin;
import manager.interfaces.InterfaceDao;
import manager.modulo.clientefornecedor.enumerator.EnumSituacaoClienteFornecedor;
import manager.modulo.clientefornecedor.enumerator.EnumSituacaoClienteFornecedor.SituacaoClienteFornecedor;
import manager.modulo.clientefornecedor.enumerator.EnumTipoClienteFornecedor;
import manager.modulo.clientefornecedor.enumerator.EnumTipoClienteFornecedor.TipoClienteFornecedor;

/**
 * Esta classe será utilizada para cadastra a entidade user no banco de dados
 *
 * @author Thiago
 */
public class ClienteFornecedorDao implements InterfaceDao {

    private int id;
    private String identificador;
    private String website;
    private String complemento;
    private String email;
    private String telefoneCelular;
    private String telefoneResidencial;
    private String telefoneComercial;
    private Timestamp dataCadastro;
    private TipoClienteFornecedor tipo;
    private SituacaoClienteFornecedor situacao;

    /**
     * Inicializando as variáveis
     */
    public ClienteFornecedorDao() {
        id = 0;
        website = "";
        complemento = "";
        telefoneCelular = "";
        telefoneResidencial = "";
        telefoneComercial = "";
        email = "";
        identificador = "";
        dataCadastro = new Timestamp(00 - 00 - 00);
        tipo = TipoClienteFornecedor.NAOENCONTRADO;
        situacao = SituacaoClienteFornecedor.NAOIDENTIFICADO;
    }

    /**
     * Buscar o id de um parceiro pelo codeNome
     *
     * @param identificador
     * @return Retorno o id do parceiro encontrato, caso contrário retorna 0
     * quando não o encontra
     */
    public static int getIdClienteFornecedorPorIdentificador(String identificador) {
        try {

            String sql = "SELECT id FROM cliente_fornecedor WHERE tx_identificador = ?";
            PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
            preparedStatement.setString(1, identificador);
            ResultSet resultSet = preparedStatement.executeQuery();
            int idBuscado = 0;
            if (resultSet.first()) {
                idBuscado = resultSet.getInt("id");
            }
            resultSet.close();
            preparedStatement.close();
            return idBuscado;
        } catch (Exception e) {
            MensagemExcessao.mostrarMensagem(e, "Buscando Clientes Fornecedores");
            return 0;
        }
    }

    public static LinkedList<String> getListaIdentificadorClienteFornecedor() {
        LinkedList<String> listaParceiros = new LinkedList<String>();
        try {

            String sql = "SELECT tx_identificador FROM cliente_fornecedor ORDER BY tx_identificador";
            PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
            ResultSet resultSet = preparedStatement.executeQuery();
            while (resultSet.next()) {
                listaParceiros.add(resultSet.getString("tx_identificador"));
            }
            resultSet.close();
            preparedStatement.close();
        } catch (Exception e) {
            MensagemExcessao.mostrarMensagem(e, "Buscando Clientes Fornecedores");
        }

        return listaParceiros;
    }

    public LinkedList<String> buscar(String option, String search, boolean limite) throws SQLException {
        LinkedList<String> result = new LinkedList<String>();
        if (!search.equals("")) {
            String sql = "";
            String tamanhoBusca = limite ? ("LIMIT 0," + Configurations.getAutoCompleteSizeSearch()) : "";
            if (option.equalsIgnoreCase("Identificador")) {// Buscando por Email
                sql = "SELECT tx_identificador FROM cliente_fornecedor WHERE tx_identificador LIKE ? ORDER BY tx_identificador " + tamanhoBusca;
                search += "%";
            } else if (option.equalsIgnoreCase("Nome Pessoa Jurídica")) {
                sql = "SELECT tx_nome_fantasia FROM pessoa_juridica WHERE tx_nome_fantasia LIKE ? ORDER BY tx_nome_fantasia " + tamanhoBusca;
                search += "%";
            } else if (option.equalsIgnoreCase("Nome Pessoa Física")) {
                sql = "SELECT tx_nome FROM pessoa_fisica WHERE tx_nome LIKE ? ORDER BY tx_nome " + tamanhoBusca;
                search += "%";
            } else if (option.equalsIgnoreCase("Cidade")) {
                sql = "SELECT tx_nome FROM cidade WHERE tx_nome LIKE ? ORDER BY tx_nome " + tamanhoBusca;
                search += "%";
            }
            if (!sql.equals("")) {
                PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
                preparedStatement.setString(1, search);
                ResultSet resultSet = preparedStatement.executeQuery();
                while (resultSet.next()) {
                    result.add(resultSet.getString(1));
                }
            }
        }
        return result;
    }

    public static LinkedList searchTable(String option, String search) throws SQLException {
        LinkedList result = new LinkedList();
        if (!search.equals("")) {
            String sql = "";
            if (option.equalsIgnoreCase("Identificador")) { // Buscando por email
                sql = "SELECT "
                        + " cf.id as IdClienteFornecedor, "
                        + " cf.tx_identificador as Identificador, "
                        + " cf.cd_tipo as Tipo, "
                        + " cf.tx_tel_cel as TelCelular, "
                        + " cf.tx_tel_com as TelComercial, "
                        + " cf.cd_situacao as Situacao, "
                        + " CASE cf.cd_tipo WHEN 2 THEN pj.tx_nome_fantasia ELSE pf.tx_nome END as Nome "
                        + "FROM "
                        + " cliente_fornecedor cf "
                        + " LEFT JOIN pessoa_juridica pj ON pj.id_cliente_fornecedor = cf.id "
                        + " LEFT JOIN pessoa_fisica pf ON pf.id_cliente_fornecedor = cf.id "
                        + "WHERE "
                        + " cf.tx_identificador LIKE ? "
                        + "ORDER BY cf.tx_identificador ";
                search += "%";
            } else if (option.equalsIgnoreCase("Nome Pessoa Jurídica")) { // Buscando por email
                sql = "SELECT "
                        + " cf.id as IdClienteFornecedor, "
                        + " cf.tx_identificador as Identificador, "
                        + " cf.cd_tipo as Tipo, "
                        + " cf.tx_tel_cel as TelCelular, "
                        + " cf.tx_tel_com as TelComercial, "
                        + " cf.cd_situacao as Situacao, "
                        + " CASE cf.cd_tipo WHEN 2 THEN pj.tx_nome_fantasia ELSE pf.tx_nome END as Nome "
                        + "FROM "
                        + " cliente_fornecedor cf "
                        + " LEFT JOIN pessoa_juridica pj ON pj.id_cliente_fornecedor = cf.id "
                        + " LEFT JOIN pessoa_fisica pf ON pf.id_cliente_fornecedor = cf.id "
                        + "WHERE "
                        + " pj.tx_nome_fantasia LIKE ? "
                        + "ORDER BY cf.tx_identificador ";
                search += "%";
            } else if (option.equalsIgnoreCase("Nome Pessoa Física")) { // Buscando por email
                sql = "SELECT "
                        + " cf.id as IdClienteFornecedor, "
                        + " cf.tx_identificador as Identificador, "
                        + " cf.cd_tipo as Tipo, "
                        + " cf.tx_tel_cel as TelCelular, "
                        + " cf.tx_tel_com as TelComercial, "
                        + " cf.cd_situacao as Situacao, "
                        + " CASE cf.cd_tipo WHEN 2 THEN pj.tx_nome_fantasia ELSE pf.tx_nome END as Nome "
                        + "FROM "
                        + " cliente_fornecedor cf "
                        + " LEFT JOIN pessoa_juridica pj ON pj.id_cliente_fornecedor = cf.id "
                        + " LEFT JOIN pessoa_fisica pf ON pf.id_cliente_fornecedor = cf.id "
                        + "WHERE "
                        + " pf.tx_nome LIKE ? "
                        + "ORDER BY cf.tx_identificador ";
                search += "%";
            } else if (option.equalsIgnoreCase("Cidade")) { // Buscando por email
                sql = "SELECT "
                        + " cf.id as IdClienteFornecedor, "
                        + " cf.tx_identificador as Identificador, "
                        + " cf.cd_tipo as Tipo, "
                        + " cf.tx_tel_cel as TelCelular, "
                        + " cf.tx_tel_com as TelComercial, "
                        + " cf.cd_situacao as Situacao, "
                        + " CASE cf.cd_tipo WHEN 2 THEN pj.tx_nome_fantasia ELSE pf.tx_nome END as Nome "
                        + "FROM "
                        + " cliente_fornecedor cf "
                        + " LEFT JOIN pessoa_juridica pj ON pj.id_cliente_fornecedor = cf.id "
                        + " LEFT JOIN pessoa_fisica pf ON pf.id_cliente_fornecedor = cf.id "
                        + " LEFT JOIN end_client_forn ec ON ec.id_cliente_fornecedor = cf.id"
                        + " LEFT JOIN endereco e ON e.id = ec.id_endereco "
                        + " LEFT JOIN cidade c ON c.id = e.id_cidade "
                        + "WHERE "
                        + " c.tx_nome LIKE ? "
                        + "ORDER BY cf.tx_identificador ";
                search += "%";
            }
            if (!sql.equals("")) {
                PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
                preparedStatement.setString(1, search);
                ResultSet resultSet = preparedStatement.executeQuery();

                LinkedList<String> columnCodeName = new LinkedList<String>();
                LinkedList<String> columnType = new LinkedList<String>();
                LinkedList<String> columnName = new LinkedList<String>();
                LinkedList<String> columnPhone = new LinkedList<String>();
                LinkedList<String> columnSituation = new LinkedList<String>();
                LinkedList<Integer> columnId = new LinkedList<Integer>();

                while (resultSet.next()) {
                    columnId.add(resultSet.getInt("IdClienteFornecedor"));
                    columnCodeName.add(resultSet.getString("Identificador"));
                    columnType.add(EnumTipoClienteFornecedor.ConvertEnumString(EnumTipoClienteFornecedor.ConverterNumeroEnum(resultSet.getInt("Tipo"))));
                    columnName.add(resultSet.getString("Nome"));
                    columnPhone.add(resultSet.getString("TelCelular") + " | " + resultSet.getString("TelComercial"));
                    columnSituation.add(EnumSituacaoClienteFornecedor.ConvertEnumString(EnumSituacaoClienteFornecedor.ConverterNumeroEnum(resultSet.getInt("Situacao"))));
                }

                result.add(columnId);
                result.add(Format.getBooleanLinkedList(columnId.size()));
                result.add(columnCodeName);
                result.add(columnType);
                result.add(columnName);
                result.add(columnPhone);
                result.add(columnSituation);
                result.add(Format.getBooleanLinkedList(columnId.size()));
            }
        }
        return result;
    }

    /**
     * Carregar as informações do objeto usuário a partir de um id
     *
     * @param id Id do usuário buscado
     */
    public void buscar(int id) {
        try {
            setId(id);
            String sql = "SELECT * FROM cliente_fornecedor WHERE id = ?";
            PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
            preparedStatement.setInt(1, id);
            ResultSet resultSet = preparedStatement.executeQuery();
            if (resultSet.first()) {
                identificador = resultSet.getString("tx_identificador");
                website = resultSet.getString("tx_website");
                complemento = resultSet.getString("tx_complemento");
                telefoneCelular = resultSet.getString("tx_tel_cel");
                telefoneResidencial = resultSet.getString("tx_tel_res");
                telefoneComercial = resultSet.getString("tx_tel_com");
                email = resultSet.getString("tx_email");
                dataCadastro = resultSet.getTimestamp("dt_cadastro");
                tipo = EnumTipoClienteFornecedor.ConverterNumeroEnum(resultSet.getInt("cd_tipo"));
                situacao = EnumSituacaoClienteFornecedor.ConverterNumeroEnum(resultSet.getInt("cd_situacao"));
            }
            resultSet.close();
            preparedStatement.close();
        } catch (Exception e) {
            MensagemExcessao.mostrarMensagem(e, "Buscando Cliente/Fornecedor");
        }
    }

    /**
     * Insere um usuário no banco
     */
    public void inserir() throws SQLException {
        String sql = "INSERT INTO "
                + " cliente_fornecedor "
                + " (tx_identificador,"
                + " dt_cadastro,"
                + " tx_website,"
                + " tx_complemento,"
                + " tx_email,"
                + " cd_tipo,"
                + " cd_situacao,"
                + " tx_tel_res,"
                + " tx_tel_com,"
                + " tx_tel_cel) "
                + "VALUES"
                + " (?," // Identificador
                + " ?,"  // Dt Cadastro
                + " ?,"  // Web Site
                + " ?,"  // Complemento
                + " ?,"  // Email
                + " ?,"  // Tipo
                + " ?,"  // Situacao
                + " ?,"  // Tel Residencial
                + " ?,"  // Tel Comercial
                + " ?)"; // Tel Celular
        PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql, PreparedStatement.RETURN_GENERATED_KEYS);

        preparedStatement.setString(1, identificador);
        preparedStatement.setTimestamp(2, dataCadastro);
        preparedStatement.setString(3, website);
        preparedStatement.setString(4, complemento);
        preparedStatement.setString(5, email);
        preparedStatement.setInt(6, EnumTipoClienteFornecedor.ConverterEnumNumero(tipo));
        preparedStatement.setInt(7, EnumSituacaoClienteFornecedor.ConverterEnumNumero(situacao));
        preparedStatement.setString(8, telefoneResidencial);
        preparedStatement.setString(9, telefoneComercial);
        preparedStatement.setString(10, telefoneCelular);
        preparedStatement.executeUpdate();

        //Recebendo o novo id gerado
        ResultSet resultSet = preparedStatement.getGeneratedKeys();
        while (resultSet.next()) {
            id = resultSet.getInt(1);
        }

        preparedStatement.close();
        resultSet.close();
    }

    /**
     * Atualiza o usuário no banco
     */
    public void atualizar() throws SQLException {
        String sql = "UPDATE "
                + "     cliente_fornecedor "
                + "SET "
                + " tx_identificador = ? ," // 1 
                + " dt_cadastro = ?," // 2
                + " tx_website = ? ," // 3
                + " tx_complemento = ? ," // 4
                + " tx_email = ? ,"  // 5
                + " cd_tipo = ? ," // 6
                + " cd_situacao = ? ,"  // 7
                + " tx_tel_res = ? ," // 8
                + " tx_tel_com = ? ," // 9
                + " tx_tel_cel  = ?  " // 10
                + "WHERE "
                + " id = ?"; // 11
        PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
        preparedStatement.setString(1, identificador);
        preparedStatement.setTimestamp(2, dataCadastro);
        preparedStatement.setString(3, website);
        preparedStatement.setString(4, complemento);
        preparedStatement.setString(5, email);
        preparedStatement.setInt(6, EnumTipoClienteFornecedor.ConverterEnumNumero(tipo));
        preparedStatement.setInt(7, EnumSituacaoClienteFornecedor.ConverterEnumNumero(situacao));
        preparedStatement.setString(8, telefoneResidencial);
        preparedStatement.setString(9, telefoneComercial);
        preparedStatement.setString(10, telefoneCelular);
        preparedStatement.setInt(11, id);
        preparedStatement.executeUpdate();
        preparedStatement.close();
    }

    public void deletar() throws SQLException {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getIdentificador() {
        return identificador;
    }

    public void setIdentificador(String identificador) {
        this.identificador = identificador;
    }

    public String getWebsite() {
        return website;
    }

    public void setWebsite(String website) {
        this.website = website;
    }

    public String getComplemento() {
        return complemento;
    }

    public void setComplemento(String complemento) {
        this.complemento = complemento;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getTelefoneCelular() {
        return telefoneCelular;
    }

    public void setTelefoneCelular(String telefoneCelular) {
        this.telefoneCelular = telefoneCelular;
    }

    public String getTelefoneResidencial() {
        return telefoneResidencial;
    }

    public void setTelefoneResidencial(String telefoneResidencial) {
        this.telefoneResidencial = telefoneResidencial;
    }

    public String getTelefoneComercial() {
        return telefoneComercial;
    }

    public void setTelefoneComercial(String telefoneComercial) {
        this.telefoneComercial = telefoneComercial;
    }

    public Timestamp getDataCadastro() {
        return dataCadastro;
    }

    public void setDataCadastro(Timestamp dataCadastro) {
        this.dataCadastro = dataCadastro;
    }

    public TipoClienteFornecedor getTipo() {
        return tipo;
    }

    public void setTipo(TipoClienteFornecedor tipo) {
        this.tipo = tipo;
    }

    public SituacaoClienteFornecedor getSituacao() {
        return situacao;
    }

    public void setSituacao(SituacaoClienteFornecedor situacao) {
        this.situacao = situacao;
    }
}
